<?php
/*
######################################
#【文档名称】: feedback接口文档
#【文档版本】：1.0
#【作    者】: wenqiang@6rooms.com
#【日    期】: 2013-11-12 17:42:14
######################################

1.获取feedback信息
	【接口版本】
		1.0
	【接口功能】
		获取feedback信息
	【接口协议】
		HTTP/GET
	【文 件 名】
		/api/feedback.php
	【输入参数】
		@prod int	  产品id
		@type int	  查询类型[取值: 1/按本地时间查询 2/按apple接口返回时间查询]
		@tms  int	  查询时间[取值: 时间戳格式, 表示从此时间开始~现在的所有记录]
		@token string 设备标识[Token]
	#参数说明#
		##根据产品id, 时间查询## 
			格式: /api/feedback.php?prod=<@prod>&type=<@type>&tms=<@tms>
			示例: {@domain}/api/feedback.php?prod=10&type=1&tms=1384237737
		##根据token查询##
			格式: /api/feedback.php?token=<@token>
			示例: {@domain}/api/feedback.php?token=30c1e1aa452beb73be38ab9f8932b40437d249fe5bb8426310e7b088b5faf542
		##注##
			使用"<>"括起来的参数为必填参数, {@domain}为接口所在域名
	【输出参数】
		<@JSON数据 | @错误代码>
		
		#@JSON数据#:
			由json_encode(feedback数据数组)后的数据
			##返回数据key说明##
				timestamp: apple提供的时间
				tokenLength: Token长度
				deviceToken: 设置标识(Token)
				tm: pncp中该记录的生成时间
			##格式##:
			[
				{
					timestamp: 1383623890,
					tokenLength: 64,
					deviceToken: "02364c27745824666d864480e0165ca3f700a56caf8b1871c2350a893af9eb89",
					tm: 1384241278
				},
				{
					timestamp: 1383623890,
					tokenLength: 64,
					deviceToken: "02364c27745824666d864480e0165ca3f700a56caf8b1871c2350a893af9eb89",
					tm: 1384237737
				}
			]

		#@错误代码#
			小于0的数字
			##错误代码含义##
				-100: 请求方式错误(非GET请求);
				-101: 参数错误(prod)
				-102: 参数错误(type)
				-103: 参数错误(tms)
				-104: 参数错误(token)
-------------------------------------------------------------------------------
*/
require_once(dirname(dirname(dirname(__FILE__))) . '/include/def.php');
require_once(INCLUDE_DIR . 'functions.php');
require_once(INCLUDE_DIR . 'HwLoader.class.php');

DEBUG ? error_reporting(E_ALL) && ini_set('display_errors', 'on') : 
				error_reporting(0) && ini_set('display_errors', 'off');

class Api_FeedbackController {
	// 错误代码
	const ERROR_CODE_INPUT = -100;
	const ERROR_CODE_PROD = -101;
	const ERROR_CODE_TYPE = -102;
	const ERROR_CODE_TMS = -103;
	const ERROR_CODE_TOKEN = -104;

	// 实例引用
	private static $instance = null;
	// 模型类
	private $models = array();

	// 构造器
	public function __construct() {
		$this->init();
	}
	
	// 初始化
	protected function init() {
		// 加载model
		$this->loadModels();
	}
	
	// 加载model对象
	protected function loadModels() {
		if (!isset($this->models['feedback']) || !$this->models['feedback']) {
			$this->models['feedback'] = Factory::model(
				'Feedback',
				array('env' => $this->getCurrentEnvVal())
			);
		}
	}
	
	// action参数分解
	protected function dispatch() {
		$this->listAction();
	}

	// 获取请求参数
	protected function getInputParam() {
		$input = $_GET;
		if (get_magic_quotes_gpc()) {
			$input = array_map ('stripslashes', $_GET);
		}
		return $input;
	}

	// 获取env变量
	protected function getCurrentEnvVal() {
		if ($_SERVER["HTTP_HOST"] == 'pncp.dev') {
			return 'DEV';
		} elseif ($_SERVER["HTTP_HOST"] == 'applepie') {
			return 'PRO';
		} else {
			if (DEBUG) {
				if ($_SERVER['HTTP_HOST'] === 'local.pncp.dev') {
					return 'DEV';
				} 
			}

			if (DEBUG) mylog('FAILED domain name -900: ', LOGFN_DEBUG);
			msglogexit(-900, LOGFN_ACCESS_ERROR);
			return null;
		}
	}
	
	// 获取产品信息
	protected function getProds() {
		return $GLOBALS['prods'];
	}

	// 获取feedback数据
	protected function listAction() {
		// 获取参数
		$input = $this->getInputParam();
		
		// 错误信息
		$error = array(
			'code' => self::ERROR_CODE_INPUT
		);
		// 结果数据
		$data = array();
		while($_SERVER['REQUEST_METHOD'] === 'GET') {
			$query = array(
				'prod' => isset($input['prod']) ? (int)$input['prod'] : 0,
				'type' => isset($input['type']) ? (int)$input['type'] : Sr_Model_Feedback::QUERY_LIST_COLUMN_TM,
				'tms' => isset($input['tms']) ? $input['tms'] : null,
				'token' => isset($input['token']) ? $input['token'] : null,
			);
			
			// 参数验证
			if (is_null($query['token'])) {
				// 验证产品ID
				$prods = $this->getProds();
				if (!$query['prod'] || !in_array($query['prod'], array_keys($prods))) {
					$error['code'] = self::ERROR_CODE_PROD;
					break;
				}

				if (!$query['type'] || !in_array($query['type'], array(Sr_Model_Feedback::QUERY_LIST_COLUMN_TM, Sr_Model_Feedback::QUERY_LIST_COLUMN_RTM))) {
					$error['code'] = self::ERROR_CODE_TYPE;
					break;
				}

				// 验证查询时间(start)秒
				if (is_null($query['tms']) || strtotime(date('Y-m-d H:i:s', $query['tms'])) != $query['tms']) {
					$error['code'] = self::ERROR_CODE_TMS;
					break;
				}
			} else {
				if (!strlen($query['token'])) {
					$error['code'] = self::ERROR_CODE_TOKEN;
					break;
				}
			}
			// 检查结果
			$error['code'] = 0;

			// 获取数据
			$data = $this->models['feedback']->format($this->models['feedback']->getList($query));

			break;
		}

		echo $error['code'] < 0 ? $error['code'] : json_encode($data);
	}
	
	// 获取实例
	public static function getInstance() {
		if (self::$instance === null) {
			self::$instance = new self();
		}

		return self::$instance;
    }

	// 执行
	public function run() {
		$this->dispatch();
	}
}

// 启动
Api_FeedbackController::getInstance()->run();